package CreationPattern.AbstractFactory;

/**
 * @Classname : PhoneComponentFactory
 * @Description : 创建型-抽象工厂
 * 一、模式定义
 *   Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
 *   （为创建一组相关或相互依赖的对象提供一个接口，而且无需指定它们的具体类。）
 *   优点：降低高层模块与底层模块之间的耦合
 *   缺点：增加代码的复杂度；扩展性差，若产品族增加一个产品，则工厂接口（违反契约）和所有工厂实现类都需要修改（违反开闭原则）。
 * 二、模式类图
 *   https://kdocs.cn/l/cruZUMKGJm45
 * 三、适用场景
 *   1、需要灵活可扩展的框架时，通过不同工厂可以获取不同的产品族（业务概念上同一产品划分不同系列，产品族是N个相关产品不同系列的组合）
 * 四、应用举例
 *
 * @Author : chentianyu
 * @Date 2023/1/8 11:07
 */


/**
 * 手机零件产品族工厂抽象类
 */
public abstract class PhoneComponentFactory {

    public void run() {
        Processor processor = createProcessor();
        Screen screen = createScreen();
        processor.run();
        screen.run();
    }


    /**
     * 生产屏幕产品
     * @return
     */
    abstract Screen createScreen();

    /**
     * 生产处理器产品
     * @return
     */
    abstract Processor createProcessor();
}


/**
 * 高端手机零件产品族工厂
 */
class LuxuryPhoneComponentFactory extends PhoneComponentFactory {

    @Override
    public Screen createScreen() {
        return new LuxuryScreen();
    }

    @Override
    public Processor createProcessor() {
        return new LuxuryProcessor();
    }
}


/**
 * 低端手机零件产品族工厂
 */
class LowPhoneComponentFactory extends PhoneComponentFactory {

    @Override
    public Screen createScreen() {
        return new LowScreen();
    }

    @Override
    public Processor createProcessor() {
        return new LowProcessor();
    }
}
